Моя UDF для работы со всем известным сервисом распознавания капчи. Если у кого есть чем дополнить или поправить - буду рад обсудить.
Код:
#include-once
;Opt('MustDeclareVars', 1) ; декларирование переменных
; #INDEX# =======================================================================================================================
; Title .........: antigate.com
; AutoIt Version : 3.0
; Language ......: Russian
; Website: ......: http://antigate.com/?action=api
; Description ...: API функции для работы с сервисом разгадывания капчи http://antigate.com/
; Author(s) .....: SERJ
; ===============================================================================================================================
; #CURRENT# =====================================================================================================================
;_antigatecom_balance: Получение текущего денежного баланса
;_antigatecom_get: Отправка изображения и получение текста капчи
;_antigatecom_bad: Пожаловаться на неправильно разгаданный текст
;_antigatecom_stats: Получение статистику использования аккаунта
;_antigatecom_statsSystem: Статистика системы в реальном времени
; ===============================================================================================================================
; #INTERNAL_USE_ONLY# ===========================================================================================================
;__antigatecom_upload: Отправка изображения на сервер
;__antigatecom_check: Получение статуса капчи
;__antigatecom_error: Перевод текста ошибки на понятный язык
; ===============================================================================================================================
; #FUNCTION# ====================================================================================================================
; Name...........: _antigatecom_balance
; Description ...: Получение текущего денежного баланса
; Syntax.........: _antigatecom_balance($apiKey)
; Parameters ....: $apiKey - ключ аккаунта
; Return values .: Success: баланс
; Failure: @error и текст ошибки
; Author ........: SERJ
; Modified.......: 16/06/2013
; ===============================================================================================================================
Func _antigatecom_balance($apiKey)
Local $sResp = InetRead('http://antigate.com/res.php?key=' & $apiKey & '&action=getbalance')
$sResp = BinaryToString($sResp)
Local $sOut = __antigatecom_error($sResp)
If $_DEBUG Then ConsoleWrite('--> проверка баланса: ' & $sOut & @LF)
If StringInStr($sResp, 'ERROR_') Then SetError(1)
Return $sOut
EndFunc ;==> _antigatecom_balance
; #FUNCTION# ====================================================================================================================
; Name...........: __antigatecom_upload
; Description ...: Отправка изображения на сервер
; Syntax.........: __antigatecom_upload($apiKey, $pathFile)
; Parameters ....: $apiKey - ключ аккаунта
; $pathFile - путь до изображения с капчёй
; Return values .: Success: id капчи
; Failure: @error и текст ошибки
; Author ........: SERJ
; Modified.......: 16/06/2013
; ===============================================================================================================================
Func __antigatecom_upload($apiKey, $pathFile)
;~~~ проверка существования файла
If Not FileExists($pathFile) Then
If $_DEBUG Then ConsoleWrite('--> файл "' & $pathFile & '" не найден' & @LF)
SetError(1)
Return 'ERROR_FILE_NOT_FOUND'
EndIf
;~~~ читаем файл капчи
Local $binFile = FileRead($pathFile)
If @error Then
If $_DEBUG Then ConsoleWrite('--> невозможно прочитать файл "' & $pathFile & '"' & @LF)
SetError(2)
Return 'ERROR_FILE_NOT_READ'
EndIf
;~~~ определяем тип файла
Local $ext = StringSplit($pathFile, '.')
$ext = $ext[$ext[0]]
Local $ContentType
Switch $ext
Case 'jpg'
$ContentType = 'image/jpeg'
Case 'gif'
$ContentType = 'image/gif'
Case 'png'
$ContentType = 'image/png'
Case Else
If $_DEBUG Then ConsoleWrite('--> не поддерживаемый формат изображения "' & $ext & '"' & @LF)
SetError(3)
Return 'ERROR_IMAGE_TYPE_NOT_SUPPORT'
EndSwitch
;~~~ собираем тело пакета
Local $boundary = '----AFnIn7z0bMWeTdpy' ; задаём разделитель данных в HTTP запросе
Local $content = '--$boundary' & @LF
$content &= 'Content-Disposition: form-data; name="method"' & @LF & @LF
$content &= 'post' & @LF ; метод передачи данных
$content &= '--' & $boundary & @LF
$content &= 'Content-Disposition: form-data; name="key"' & @LF & @LF
$content &= $apiKey & @LF ; ключ
;$content &= '--' & $boundary & @LF
;$content &= 'Content-Disposition: form-data; name="regsense"' & @LF & @LF
;$content &= '1' & @LF ; с учетом регистра
$content &= '--' & $boundary & @LF
$content &= 'Content-Disposition: form-data; name="file"; filename="captcha.' & $ext & '"' & @LF
$content &= 'Content-Type: ' & $ContentType & @LF & @LF
$content &= $binFile & @LF ; содержимое ФАЙЛА капчи, БЕЗ какого либо кодирования, целиком
$content &= '--' & $boundary & '--'
;~~~ отправка капчи
Local $oWinHttp = ObjCreate('WinHttp.WinHttpRequest.5.1') ; создаём COM-объект
With $oWinHttp
.Open('POST', 'http://antigate.com/in.php', 0) ; создаём соеденение, указываем адрес страницы
.SetRequestHeader('Content-Type', 'multipart/form-data; boundary=' & $boundary) ; тип отправляемого запроса
.SetRequestHeader('Content-Length', BinaryLen($binFile)) ; длина запроса
.Send(StringToBinary($content, 1)) ; отправляем запрос
Local $sResp = .ResponseText ; получаем ответ
EndWith
;~~~ разбираем ответ отправки
Dim $idCapcha = StringSplit($sResp, '|') ; парсим ответ
If $idCapcha[1] = 'OK' Then
$idCapcha = $idCapcha[2]
If $_DEBUG Then ConsoleWrite('--> id капчи: ' & $idCapcha & @LF)
Return $idCapcha
Else
Local $sOut = __antigatecom_error($sResp)
If $_DEBUG Then ConsoleWrite('--> сервер вернул ошибку: ' & $sOut & @LF)
SetError(4)
Return $sOut
EndIf
EndFunc ;==> __antigatecom_upload
; #FUNCTION# ====================================================================================================================
; Name...........: __antigatecom_check
; Description ...: Получение статуса капчи
; Syntax.........: __antigatecom_check($apiKey, $idCaptcha, $secTimeout)
; Parameters ....: $apiKey - ключ аккаунта
; $idCaptcha - id капчи
; $secTimeout - таймаут проверки капчи (минимум 5 сек.), не обязательно для указания
; Return values .: Success: текст капчи
; Failure: @error и текст ошибки
; Author ........: SERJ
; Modified.......: 16/06/2013
; ===============================================================================================================================
Func __antigatecom_check($apiKey, $idCaptcha, $secTimeout = 5)
;If $secTimeout < 5 Then $secTimeout = 5
Local $sResp
While 1
Sleep(1000*$secTimeout)
$sResp = InetRead('http://antigate.com/res.php?key=' & $apiKey & '&action=get&id=' & $idCaptcha & '&rnd=' & Random())
$sResp = BinaryToString($sResp)
Local $textCaptcha = StringSplit($sResp, '|') ; парсим ответ
If $textCaptcha[1] = 'OK' Then
$textCaptcha = $textCaptcha[2]
If $_DEBUG Then ConsoleWrite('--> текст капчи: ' & $textCaptcha & @LF)
Return $textCaptcha
ElseIf $sResp = 'CAPCHA_NOT_READY' Then
If $_DEBUG Then ConsoleWrite('--> капча ещё не распознана' & @LF)
Else
Local $sOut = __antigatecom_error($sResp)
If $_DEBUG Then ConsoleWrite('--> ошибка распознавания капчи: ' & $sOut & @LF)
SetError(1)
Return $sOut
EndIf
WEnd
EndFunc ;==> __antigatecom_check
; #FUNCTION# ====================================================================================================================
; Name...........: _antigatecom_bad
; Description ...: Пожаловаться на неправильно разгаданный текст
; Syntax.........: _antigatecom_bad($apiKey, $idCaptcha)
; Parameters ....: $apiKey - ключ аккаунта
; $idCaptcha - id капчи
; Return values .: Success: 1
; Failure: @error и текст ошибки
; Author ........: SERJ
; Modified.......: 17/06/2013
; ===============================================================================================================================
Func _antigatecom_bad($apiKey, $idCaptcha)
If $_DEBUG Then ConsoleWrite('--> жалуемся на капчу с id #' & $idCaptcha & @LF)
Local $sResp = InetRead('http://antigate.com/res.php?key=' & $apiKey & '&action=reportbad&id=' & $idCaptcha)
$sResp = BinaryToString($sResp)
Local $sOut = __antigatecom_error($sResp)
If $sResp <> 'OK_REPORT_RECORDED' Then SetError(1)
Return $sOut
EndFunc ;==> _antigatecom_bad
; #FUNCTION# ====================================================================================================================
; Name...........: _antigatecom_get
; Description ...: Отправка изображения и получение текста капчи
; Syntax.........: _antigatecom_get($apiKey, $pathFile, $secTimeout)
; Parameters ....: $apiKey - ключ аккаунта
; $pathFile - путь до изображения с капчёй
; $secTimeout - таймаут проверки капчи (минимум 5 сек.), не обязательно для указания
; Return values .: Success: текст капчи
; Failure: @error и текст ошибки
; Related .......: __antigatecom_upload, __antigatecom_check
; Author ........: SERJ
; Modified.......: 16/06/2013
; ===============================================================================================================================
Func _antigatecom_get($apiKey, $pathFile, $secTimeout = 5)
;~~~ отправка изображения на сервер
Local $idCaptcha = __antigatecom_upload($apiKey, $pathFile)
If @error Then
If $_DEBUG Then ConsoleWrite('--> ошибка отправки картинки: ' & $idCaptcha & @LF)
SetError(1)
Return 'ERROR_UPLOAD'
EndIf
If Not IsDeclared('_IDCAPTCHA') Then Global $_IDCAPTCHA
$_IDCAPTCHA = $idCaptcha ; для того, чтобы можно было жаловаться
;~~~ получение текста капчи
Local $textCaptcha = __antigatecom_check($apiKey, $idCaptcha, $secTimeout)
If @error Then
If $_DEBUG Then ConsoleWrite('--> ошибка получения текста капчи: ' & $textCaptcha & @LF)
SetError(2)
Return 'ERROR_CHECK'
EndIf
Return $textCaptcha
EndFunc ;==> _antigatecom_get
; #FUNCTION# ====================================================================================================================
; Name...........: _antigatecom_stats
; Description ...: Получение статистику использования аккаунта
; Syntax.........: _antigatecom_stats($apiKey, $date)
; Parameters ....: $apiKey - ключ аккаунта
; $date - дата, за которую требуется получить статистику (формат ДД.ММ.ГГГГ), не обязательно для указания
; Return values .: Success: текст капчи
; Failure: @error и текст ошибки
; Author ........: SERJ
; Modified.......: 16/06/2013
; ===============================================================================================================================
Func _antigatecom_stats($apiKey, $date = '')
If Not $date Then $date = @MDAY & '.' & @MON & '.' & @YEAR
MsgBox(0, '', $date)
Local $aDate = StringSplit($date, '.')
$date = $aDate[3] & '-' & $aDate[2] & '-' & $aDate[1]
Local $sResp = InetRead('http://antigate.com/res.php?key=' & $apiKey & '&action=getstats&date=' & $date)
$sResp = BinaryToString($sResp)
Local $sOut = __antigatecom_error($sResp)
If StringInStr($sResp, 'ERROR_') Then SetError(1)
Return $sOut
EndFunc ;==> _antigatecom_stats
; #FUNCTION# ====================================================================================================================
; Name...........: _antigatecom_statsSystem
; Description ...: Статистика системы в реальном времени
; Syntax.........: _antigatecom_statsSystem()
; Parameters ....: none
; Return values .: необходимо доработать
; Author ........: SERJ
; Modified.......: 16/06/2013
; ===============================================================================================================================
Func _antigatecom_statsSystem()
; waiting: количество работников ожидающих капчу. Максимально показываемое число - 50.
; load: процент загрузки работников
; minbid: минимальная ставка необходимая для прохождения вашей капчи
; averageRecognitionTime: среднее время (в секундах) за которое в данный момент разгадываются капчи
Local $sResp = InetRead('http://antigate.com/load.php')
$sResp = BinaryToString($sResp)
Return $sResp
EndFunc ;==> _antigatecom_statsSystem
; #FUNCTION# ====================================================================================================================
; Name...........: __antigatecom_error
; Description ...: Перевод текста ошибки на понятный язык
; Syntax.........: __antigatecom_error($sError)
; Parameters ....: $sError - текст ошибки, возвращаемый сервером
; Return values .: ...
; Author ........: SERJ
; Modified.......: 17/06/2013
; ===============================================================================================================================
Func __antigatecom_error($sError)
Switch $sError
Case 'ERROR_WRONG_USER_KEY'
Return 'Неправильный формат ключа учетной записи (длина не равняется 32 байтам)'
Case 'ERROR_KEY_DOES_NOT_EXIST'
Return 'Вы использовали неверный captcha ключ в запросевы использовали неверный captcha ключ в запросе'
Case 'ERROR_ZERO_BALANCE'
Return 'Нулевой либо отрицательный баланс'
Case 'ERROR_NO_SLOT_AVAILABLE'
Return 'Нет свободных работников в данный момент, попробуйте позже либо повысьте свою максимальную ставку'
Case 'ERROR_ZERO_CAPTCHA_FILESIZE'
Return 'Размер капчи которую вы загружаете менее 100 байт'
Case 'RROR_TOO_BIG_CAPTCHA_FILESIZE'
Return 'Ваша капча имеет размер более 100 килобайт'
Case 'ERROR_WRONG_FILE_EXTENSION'
Return 'Ваша капча имеет неверное расширение, допустимые расширения JPG, JPEG, GIF, PNG'
Case 'ERROR_IMAGE_TYPE_NOT_SUPPORTED'
Return 'Невозможно определить тип файла капчи, принимаются только форматы JPG, GIF, PNG'
Case 'ERROR_IP_NOT_ALLOWED'
Return 'Запрос с этого IP адреса с текущим ключом отклонен. Пожалуйста смотрите раздел управления доступом по IP'
Case 'CAPCHA_NOT_READY'
Return 'Капча еще не распознана, повторите запрос через 1-5 секунд'
Case 'ERROR_WRONG_ID_FORMAT'
Return 'Некорректный идентификатор капчи, принимаются только цифры'
Case 'ERROR_CAPTCHA_UNSOLVABLE'
Return 'Капчу не смогли разгадать 5 разных работников'
Case 'OK_REPORT_RECORDED'
Return 'Жалоба на неверно разгаданную капчу принята'
Case Else
Return $sError
EndSwitch
EndFunc ;==> __antigatecom_error